package net.hands.common.mail;

import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
 * 
 *说明:普通邮件
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class CommonEmail {

	public static final String X_PRIORITY = "X-Priority";
   /**
    * 优先级最高
    */
	public static final int PRIORITY_HIGHEST = 1;
	/**
	 * 优先级高
	 */
	public static final int PRIORITY_HIGH = 2;
	/**
	 * 优先级一般
	 */
	public static final int PRIORITY_NORMAL = 3;
	/**
	 * 优先级低
	 */
	public static final int PRIORITY_LOW = 4;
	/**
	 * 优先级最低
	 */
	public static final int PRIORITY_LOWEST = 5;

	// ---------------------------------------------------------------- from
   /**
    * 来源
    */
	protected String from;
   /**
   * 说明:设置来源
   * @param from 来源
   * @update 2012-9-20 下午6:34:10
    */
	public void setFrom(final String from) {
		this.from = from;
	}
   /**
   * 说明:获得来源 
   * @return String
   * @update 2012-9-20 下午6:34:20
    */
	public String getFrom() {
		return from;
	}

	// ---------------------------------------------------------------- to
   /**
    * 发送地址数组
    */
	protected String[] to = new String[0];
   /**
   * 说明:设置发送地址数组 
   * @param tos 0~多个发送地址
   * @update 2012-9-20 下午6:34:47
    */
	public void setTo(String... tos) {
		if (tos == null) {
			tos = new String[0];
		}
		to = tos;
	}
  /**
   * 说明:获得发送地址数组
  * @return String[] 字符数组
  * @update 2012-9-20 下午6:35:05
   */
	public String[] getTo() {
		return to;
	}

	// ---------------------------------------------------------------- reply-to
   /**
    * 回复地址数组
    */
	protected String[] replyTo = new String[0];
   /**
   * 说明:设置回复地址数组
   * @param replyTo 回复地址
   * @update 2012-9-20 下午6:36:45
    */
	public void setReplyTo(String... replyTo) {
		if (replyTo == null) {
			replyTo = new String[0];
		}
		this.replyTo = replyTo;
	}
   /**
   * 说明:获得恢复地址数组 
   * @return String[]
   * @update 2012-9-20 下午6:37:02
    */
	public String[] getReplyTo() {
		return replyTo;
	}

	// ---------------------------------------------------------------- cc
   /**
    * 抄送地址数组
    */
	protected String[] cc = new String[0];
  /**
  * 说明:设置抄送地址数组 
  * @param ccs 抄送地址
  * @update 2012-9-20 下午6:37:47
   */
	public void setCc(String... ccs) {
		if (ccs == null) {
			ccs = new String[0];
		}
		cc = ccs;
	}
  /**
  * 说明:获得抄送地址数组
  * @return String[]
  * @update 2012-9-20 下午6:38:05
   */
	public String[] getCc() {
		return cc;
	}

	// ---------------------------------------------------------------- bcc
  /**
   * 被抄送地址数组
   */
	protected String[] bcc = new String[0];
   /**
   * 说明:被抄送地址数组
   * @param bccs 0~多个被抄送地址
   * @update 2012-9-20 下午6:38:56
    */
	public void setBcc(String... bccs) {
		if (bccs == null) {
			bccs = new String[0];
		}
		bcc = bccs;
	}
  /**
   * 说明:获得被抄送地址
  * @return String[] 字符串数组
  * @update 2012-9-20 下午6:39:33
   */
	public String[] getBcc() {
		return bcc;
	}

	// ---------------------------------------------------------------- subject
   /**
    * 主题
    */
	protected String subject;
   /**
   * 说明:设置主题 
   * @param subject 主题
   * @update 2012-9-20 下午6:40:00
    */
	public void setSubject(final String subject) {
		this.subject = subject;
	}
   /**
   * 说明:获得主题  
   * @return String
   * @update 2012-9-20 下午6:40:14
    */
	public String getSubject() {
		return this.subject;
	}

	// ---------------------------------------------------------------- message
   /**
    * 信息集合
    */
	protected LinkedList<EmailMessage> messages = new LinkedList<EmailMessage>();
   /**
   * 说明:获得所有信息 
   * @return LinkedList<EmailMessage>
   * @update 2012-9-20 下午6:40:46
    */
	public LinkedList<EmailMessage> getAllMessages() {
		return messages;
	}
   /**
    * 说明:添加信息
   * @param emailMessage 信息
   * @update 2012-9-20 下午6:41:02
    */
	public void addMessage(final EmailMessage emailMessage) {
		messages.add(emailMessage);
	}
   /**
   * 说明:添加信息 
   * @param text 内容
   * @param mimeType 协议类型
   * @param encoding 编码
   * @update 2012-9-20 下午6:41:21
    */
	public void addMessage(final String text, final String mimeType, final String encoding) {
		messages.add(new EmailMessage(text, mimeType, encoding));
	}
   /**
   * 说明:点击信息 
   * @param text 内容
   * @param mimeType 协议类型
   * @update 2012-9-20 下午6:42:17
    */
	public void addMessage(final String text, final String mimeType) {
		messages.add(new EmailMessage(text, mimeType));
	}

	// ---------------------------------------------------------------- headers
   /**
    * 头部信息容器
    */
	protected Map<String, String> headers;
   /**
   * 说明:获得所有头信息容器
   * @return  Map<String, String>
   * @update 2012-9-20 下午6:47:50
    */
	protected Map<String, String> getAllHeaders() {
		return headers;
	}
  /**
  * 说明:设置头信息容器
  * @param name 名称
  * @param value 值
  * @update 2012-9-20 下午6:48:15
   */
	public void setHeader(final String name, final String value) {
		if (headers == null) {
			headers = new HashMap<String, String>();
		}
		headers.put(name, value);
	}
   /**
   * 说明:获得头 
   * @param name 名称
   * @return String
   * @update 2012-9-20 下午6:48:31
    */
	public String getHeader(final String name) {
		if (headers == null) {
			return null;
		}
		return headers.get(name);
	}
   /**
   * 说明:设置优先级
   * @param priority 优先权
   * @update 2012-9-20 下午6:48:47
    */
	public void setPriority(final int priority) {
		setHeader(X_PRIORITY, String.valueOf(priority));
	}
   /**
   * 说明:获得优先级
   * @return int
   * @update 2012-9-20 下午6:49:21
    */
	public int getPriority() {
		if (headers == null) {
			return -1;
		}
		try {
			return Integer.parseInt(headers.get(X_PRIORITY));
		} catch (final NumberFormatException ignore) {
			return -1;
		}
	}

	// ---------------------------------------------------------------- date
  /**
   * 设置日期
   */
	protected Date sentDate;
   /**
   * 说明:设置发送日期
   * @param date 日期
   * @update 2012-9-20 下午6:50:10
    */
	public void setSentDate(final Date date) {
		sentDate = date;
	}
   /**
   * 说明:获得发送日期
   * @return Date 日期
   * @update 2012-9-20 下午6:50:24
    */
	public Date getSentDate() {
		return sentDate;
	}
}
